// Software License Agreement (BSD License)
//
// Copyright (c) 2012-2013, Fraunhofer FKIE/US
// All rights reserved.
// Author: Torsten Fiolka
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
//  * Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above
//    copyright notice, this list of conditions and the following
//    disclaimer in the documentation and/or other materials provided
//    with the distribution.
//  * Neither the name of Fraunhofer FKIE nor the names of its
//    contributors may be used to endorse or promote products derived
//    from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

template <typename FixedPayloadT>
std::ostream& sure::octree::operator<<(std::ostream& stream, Node<FixedPayloadT>& rhs)
{
  stream.setf(std::ios_base::fixed);
  stream << std::setprecision(3);
  stream << "Node Region: " << rhs.region_ << " - depth " << rhs.depth() << " - children: ";
  for(OctantType i=0; i<OCTANT; ++i)
  {
    stream << (rhs.children_[i] ? 1 : 0);
  }
  stream << " - parent: " << (rhs.parent_ ? 1 : 0) << "\n";
  stream << rhs.fixed();
  if( rhs.opt() )
  {
    sure::payload::Payload* payload = rhs.opt();
    if( dynamic_cast<sure::payload::NormalPayload*>(payload) )
    {
      stream << *dynamic_cast<sure::payload::NormalPayload*>(payload);
    }
    if( dynamic_cast<sure::payload::NormalPayload*>(payload) )
    {
      stream << *dynamic_cast<sure::payload::NormalPayload*>(payload);
    }
    if( dynamic_cast<sure::payload::EntropyPayload*>(payload) )
    {
      stream << *dynamic_cast<sure::payload::EntropyPayload*>(payload);
    }
  }
  else
  {
    stream << "No optional payload.\n";
  }
  stream.unsetf(std::ios_base::fixed);
  return stream;
}
